abstract class | concrete class
abstract class always involve abstract method
abstract
above expression same as
abstract int add(int x, int y);
상속만을 위한 추상 클래스(모든 추상 메서드를 구현한 추상 클래스 포함)는 new 예약어로 인스턴스 생성 불가능
Template design patter
Car.java
package template;
public abstract class Car {
public abstract void drive();
public abstract void stop();
public void startCar() {
System.out.println("시동을 켭니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
final public void run() {
startCar();
drive();
stop();
turnOff();
}
}
AICar.java
package template;
public class AICar extends Car {
@Override
public void drive() {
System.out.println("자율 주행합니다.");
System.out.println("자동차가 알아서 방향을 전환합니다.");
}
@Override
public void stop() {
System.out.println("스스로 멈춥니다.");
}
}
ManualCar.java
package template;
public class ManualCar extends Car{
@Override
public void drive() {
System.out.println("사람이 운전합니다.");
System.out.println("사람이 핸들을 조작합니다.");
}
@Override
public void stop() {
System.out.println("브레이크로 정지합니다.");
}
}
CarTest.java
package template;
public class CarTest {
public static void main(String[] args) {
System.out.println("=== 자율 주행하는 자동차 ===");
Car myCar=new AICar();
myCar.run();
System.out.println("=== 사람이 운전하는 자동차 ===");
Car hisCar=new ManualCar();
hisCar.run();
}
}
using template method example;
Player.java
package gameLevel;
public class Player {
private PlayerLevel level;
public Player() {
level=new BeginnerLevel();
level.showLevelMessage();
}
public PlayerLevel getLevel() {
return level;
}
public void upgradeLevel(PlayerLevel level) {
this.level=level;
level.showLevelMessage();
}
public void play(int count) {
level.go(count);
}
}
PlayerLevel.java
package gameLevel;
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
final public void go(int count) {
run();
for(int i=0;i<count;i++) {
jump();
}
turn();
}
}
BeginnerLevel.java
package gameLevel;
public class BeginnerLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("천천히 달립니다.");
}
@Override
public void jump() {
System.out.println("Jump 할 수 없니다.");
}
@Override
public void turn() {
System.out.println("Turn 할 수 없습니다.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 초보자 레벨입니다. *****");
}
}
AdvancedLevel.java
package gameLevel;
public class AdvancedLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("높이 Jump합니다.");
}
@Override
public void turn() {
System.out.println("Turn 할 수 없습니다.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 중급자 레벨입니다. *****");
}
}
SuperLevel.java
package gameLevel;
public class SuperLevel extends PlayerLevel {
@Override
public void run() {
System.out.println("엄청 빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("아주 높이 Jump 합니다.");
}
@Override
public void turn() {
System.out.println("한 바퀴 돕니다.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 고급자 레벨입니다. *****");
}
}
MainBoard.java
package gameLevel;
public class MainBoard {
public static void main(String[] args) {
Player player=new Player();
player.play(1);
AdvancedLevel aLevel=new AdvancedLevel();
player.upgradeLevel(aLevel);
player.play(2);
SuperLevel SLevel=new SuperLevel();
player.upgradeLevel(SLevel);
player.play(3);
}
}
final
사용위치 | 설명 |
변수 | final 변수는 상수를 의미합니다. |
메서드 | final 메서드는 하위 클래스에서 재정의할 수 없습니다. |
클래스 | final 클래스는 상속할 수 없습니다. |